package com.byfan.barter.controller;

import com.byfan.barter.entity.User;
import com.byfan.barter.service.UserService;
import com.byfan.barter.utils.AesCbcUtil;
import com.byfan.barter.utils.HttpRequestUtil;
import com.byfan.barter.utils.Message;
import com.byfan.barter.utils.MessageUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: FBY
 * @Description
 * @Version 1.0
 * @Date: 2021/5/16 13:48
 */
@Api(description = "微信用户接口")
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 解密用户信息，注册新用户/修改用户信息
     * @param encryptedData 加密数据
     * @param iv 偏移量
     * @param code 登录凭证
     * @return
     */
    @ApiOperation("根据登录凭证，获取用户信息")
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public Message decodeUserInfo(String encryptedData,String iv,String code){

        // 登录凭证不能为空
        if (code==null || code.length()==0){
            return MessageUtil.error("code不能为空");
        }

        //小程序唯一标识(在微信小程序管理后台获取)
        String wxspAppid = "wx75f90430d5ddc9fa";
        //小程序的app secret(在微信小程序管理后台获取)
        String wxspSecret = "68a97c7ee2cc2152f5a3a4d83c417e3f";
        //授权(必填)
        String grant_type = "authorization_code";

        //*********1.向微信服务器使用登录凭证code获取session_key和openid*******************************//
        //拼接请求参数
        String params = "appid=" + wxspAppid
                + "&secret=" + wxspSecret
                + "&js_code=" + code
                +"&grant_type=" + grant_type;
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        //发送请求
        String sr = HttpRequestUtil.sendGet(url,params);

        //解析相应内容(转换成json对象)
        JSONObject json = new JSONObject(sr);

        //获取会话密钥(session_key)
        String session_key = json.get("session_key").toString();

        //用户的唯一标识(openid)
        String openid = json.get("openid").toString();

        //*********2.对encryptedData加密数据进行AES解密**************************************************//
        User user = new User();
        try {
            String result = AesCbcUtil.decrypt(encryptedData,session_key,iv,"UTF-8");
            if (result!=null && result.length()>0){
                JSONObject userInfoJSON = new JSONObject(result);
                //创建返回对象

                user.setOpenId(userInfoJSON.get("openId").toString());
                user.setNickName(userInfoJSON.get("nickName").toString());
                user.setGender(Integer.parseInt(userInfoJSON.get("gender").toString()));
                String address = userInfoJSON.get("city")
                        + "/" + userInfoJSON.get("province")
                        + "/" + userInfoJSON.get("country");
                user.setAddress(address);
                user.setAvatarUrl(userInfoJSON.get("avatarUrl").toString());
                //注册验证，如果是首次登录，将信息写入数据库，如果不是，则进行信息更新
                userService.save(user);

                Map userInfo = new HashMap();

                //解密unionId & openId
                //这个信息是只给符合条件的用户下发,如不符合,则没有这个数据,在调用时需要做相应的判断,否则直接取值会报错,
                if(!userInfoJSON.isNull("unionId")){
                    userInfo.put("unionId",userInfoJSON.get("unionId"));
                    return MessageUtil.success("解密成功",userInfo);
                }


            }else {
                return MessageUtil.error("解密失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return MessageUtil.success("解密成功",user);
    }

    @ApiOperation("根据用户openId获取用户信息")
    @RequestMapping(value = "getById",method = RequestMethod.GET)
    public Message getById(String openId){
        User user = userService.getById(openId);
        if (user!=null){
            return MessageUtil.success(user);
        }
        return MessageUtil.success("该用户不存在");
    }
}
